package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.mapper.TrackInfoMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.security.PublicKey;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Autowired
	private TrackInfoMapper trackInfoMapper;

	// 获取当前用户全部专辑列表
	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {
		// 默认查看第一页，每页显示100条数据
		Page<AlbumInfo> albumInfoPage = new Page<>(1,100);
		// 设置查询条件
		LambdaQueryWrapper<AlbumInfo> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.select(AlbumInfo::getId,AlbumInfo::getAlbumTitle);
		queryWrapper.eq(AlbumInfo::getUserId,userId);
		queryWrapper.orderByDesc(AlbumInfo::getId);
		IPage<AlbumInfo> page = albumInfoMapper.selectPage(albumInfoPage, queryWrapper);
		List<AlbumInfo> list = page.getRecords();
		return list;
	}

	@Override
	public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {
		// 根据专辑id修改专辑基本信息
		AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
		albumInfoMapper.updateById(albumInfo);

		// 根据专辑id删除标签名名称和标签值数据
		LambdaQueryWrapper<AlbumAttributeValue> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(queryWrapper);

		// 添加专辑下面 标签名称和标签值数据
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
				albumAttributeValue.setAlbumId(albumId);
				albumAttributeValueMapper.insert(albumAttributeValue);

			});
		}
	}

	@Override
	public AlbumInfo getAlbumInfo(Long albumId) {

		// 1.根据专辑id获取专辑信息
		AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);
		// 2.根据专辑id获取专辑标签数据
		LambdaQueryWrapper<AlbumAttributeValue> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		List<AlbumAttributeValue> albumAttributeValues = albumAttributeValueMapper.selectList(queryWrapper);
		// 3.把获取标签数据list集合封装到专辑对象里面
		if (!CollectionUtils.isEmpty(albumAttributeValues)){
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
		}
		return albumInfo;
	}

	// 删除专辑
	@Override
	public void removeAlbumInfo(Long albumId) {

		// 1.判断专辑里是否存在声音，如果包含不能删除
		LambdaQueryWrapper<TrackInfo> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(TrackInfo::getAlbumId,albumId);
		Long count = trackInfoMapper.selectCount(queryWrapper);
		if (count>0){
			throw new GuiguException(400,"专辑里包含声音，不能删除");
		}

		// 2.专辑里没有声音可以逐个删除
		// 删除专辑基本信息
		albumInfoMapper.deleteById(albumId);
		// 删除专辑标签名称和标签值数据
		LambdaQueryWrapper<AlbumAttributeValue> lambdaQueryWrapperAlbumAttributeValue = new LambdaQueryWrapper<>();
		lambdaQueryWrapperAlbumAttributeValue.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(lambdaQueryWrapperAlbumAttributeValue);
		// 删除专辑四个统计数据
		LambdaQueryWrapper<AlbumStat> lambdaQueryWrapperAlbumStat = new LambdaQueryWrapper<>();
		lambdaQueryWrapperAlbumStat.eq(AlbumStat::getAlbumId,albumId);
		albumStatMapper.delete(lambdaQueryWrapperAlbumStat);
	}



	// 保存专辑
	// 当前操作多张表，保证多张表数据一致性，添加事务
	// 当前这些表在一个数据库里面，这种事务称为本地事务
	@Transactional
	@Override
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo) {

		// 1 添加专辑基本信息 album_info
		AlbumInfo albumInfo = new AlbumInfo();
		// AlbumInfoVo的值放到AlbumInfo
//		String albumTitle = albumInfoVo.getAlbumTitle();
//		albumInfo.setAlbumTitle(albumTitle);
		BeanUtils.copyProperties(albumInfoVo,albumInfo);

		// 专辑有几个值需要单独设置，前端没有传递过来的
		//TODO userId 用户id后面完善
		albumInfo.setUserId(1L);
		// 专辑状态，设置通过
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		// 设置收费专辑，免费试听集数，前3集
		String payType = albumInfo.getPayType();
		if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(payType)) {
			albumInfo.setTracksForFree(3);
		}
		// 调用方法保存
		albumInfoMapper.insert(albumInfo);

		// 2 添加专辑下面的标签名称和标签值数据 album_attribute_value
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		// 方法一：非空判断
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			// 遍历集合，添加到数据库
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				// 把AlbumAttributeValueVo转成AlbumAttributeValue
				BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
				// 专辑id
				albumAttributeValue.setAlbumId(albumInfo.getId());
				// 调用方法保存
				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}
		// 方法二： List<AlbumAttributeValueVo> -- List<AlbumAttributeValue>
		/*albumAttributeValueVoList.stream().map(albumAttributeValueVo -> {
			AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
			BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
			albumAttributeValue.setAlbumId(albumInfo.getId());
			return albumAttributeValue;
		}).collect(Collectors.toList());
		// 批量添加
		// 看视频建一个service调用里面的批量操作方法
		albumAttributeValueService.saveBatch(albumAttributeValueList);*/


		// 3 添加专辑四个统计数据：播放量、收藏量、评论量、点赞量
		//播放量
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_PLAY);
		//订阅量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
		//购买量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
		//评论数
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);



	}

	// 查询专辑列表
	@Override
	public IPage<AlbumInfoVo> selectAlbumPage(Page<AlbumInfoVo> pageParam, AlbumInfoQuery albumInfoQuery) {
		return albumInfoMapper.selectUserAlbumPage(pageParam,albumInfoQuery);
	}
	// 保存专辑统计数据的方法
	public void saveAlbumStat(Long albumId,String statType){
		AlbumStat albumStat = new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);// 0401  0402 ....0403
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat);
	}
}
